<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // 继承  让一个类(构造函数) 继承 另一个类(构造函数) 的属性和方法(实例化对象 原型对象)  或者重新定义、追加属性和方法等。
    // 本质: 通过继承实现属性和方法的复用,提高代码复用性

    // 继承的类: 子类
    // 被继承的类: 父类

    function Person(name, age) {
        // this -> 指向构造函数Person执行过程中创建的实例化对象
        this.name = name;
        this.age = age;
    }

    Person.prototype.species = "human";
    Person.prototype.skill = function(){
        console.log("thinking");
    };
    Person.prototype.say = function(){
        console.log(this.name, this.age);
    };

    // p的原型链: p -> Person.prototype -> Object.prototype ->  null 
    var p  = new Person("张三", 18);
    console.log(p);

    function YellowPerson(name, age , hobby){
        // this -> 指向构造函数YellowPerson执行过程中创建的实例化对象
        this.name = name;
        this.age = age;
        this.hobby = hobby;
    };

     // p的原型链:   p -> Person.prototype -> Object.prototype ->  null 
    // yp的原型链: yp -> YellowPerson.prototype -> Object.prototype ->  null 

    // 最简单的原型继承(最low的 浅复制=>YellowPerson.prototype 和 Person.prototype共有同一片内存空间 只要有一个改动 另一个也会有影响)
    // 修改之后:  希望yp的原型链上 存在 Person.prototype
    // yp的原型链: yp -> YellowPerson.prototype(Person.prototype) -> Object.prototype ->  null 
    YellowPerson.prototype = Person.prototype;

    //先继承父元素的，再定义自己的
    YellowPerson.prototype.speak = function(){
        console.log("chinese");
    };

    var yp = new YellowPerson("王五", 88 , "pc");
    console.log(yp);

    console.log(yp.species);
    yp.skill();
</script>
</html>